/**
 *******************************************************************************
 * @file  hc32_ll_event_port.h
 * @brief This file contains all the functions prototypes of the Event Port
 *        driver library.
 @verbatim
   Change Logs:
   Date             Author          Notes
   2022-03-31       CDT             First version
 @endverbatim
 *******************************************************************************
 * Copyright (C) 2022-2023, Xiaohua Semiconductor Co., Ltd. All rights reserved.
 *
 * This software component is licensed by XHSC under BSD 3-Clause license
 * (the "License"); You may not use this file except in compliance with the
 * License. You may obtain a copy of the License at:
 *                    opensource.org/licenses/BSD-3-Clause
 *
 *******************************************************************************
 */
#ifndef __HC32_LL_EVENT_PORT_H__
#define __HC32_LL_EVENT_PORT_H__

/* C binding of definitions if building with C++ compiler */
#ifdef __cplusplus
extern "C"
{
#endif

/*******************************************************************************
 * Include files
 ******************************************************************************/
#include "hc32_ll_def.h"

#include "hc32f4xx.h"
#include "hc32f4xx_conf.h"
  /**
   * @addtogroup LL_Driver
   * @{
   */

  /**
   * @addtogroup LL_EVENT_PORT
   * @{
   */

#if (LL_EVENT_PORT_ENABLE == DDL_ON)
  /*******************************************************************************
   * Global type definitions ('typedef')
   ******************************************************************************/
  /**
   * @defgroup EP_Global_Types Event Port Global Types
   * @{
   */

  /**
   * @brief  Event Pin Set and Reset enumeration
   */
  typedef enum
  {
    EVT_PIN_RESET = 0U, /*!< Pin reset    */
    EVT_PIN_SET = 1U    /*!< Pin set      */
  } en_ep_state_t;

  typedef struct
  {
    uint32_t u32PinDir; /*!< Input/Output setting, @ref EP_PinDirection_Sel for details */                         // 输入/输出设置，@ref EP_PinDirection_Sel了解详细信息
    en_ep_state_t enPinState; /*!< Corresponding pin initial state, @ref en_ep_state_t for details */              // 对应的引脚初始状态，@ref en_ep_state_t了解详细信息
    uint32_t u32PinTriggerOps; /*!< Corresponding pin state after triggered, @ref EP_TriggerOps_Sel for details */ // 触发后对应的引脚状态，详情请参见@ref EP_TriggerOps_Sel
    uint32_t u32Edge; /*!< Event port trigger edge, @ref EP_Trigger_Sel for details */                             // 事件端口触发器边缘，@ref EP_trigger_Sel了解详细信息
    uint32_t u32Filter; /*!< Filter clock function setting, @ref EP_FilterClock_Sel for details */                 // 过滤器时钟功能设置，@ref EP_FilterClock_Sel了解详细信息
    uint32_t u32FilterClock; /*!< Filter clock, ref@ EP_FilterClock_Div for details */                             // 过滤器时钟，详情请参考@EP_FilterClock_Div
  } stc_ep_init_t;
/**
 * @}
 */

/*******************************************************************************
 * Global pre-processor symbols/macros ('#define')
 ******************************************************************************/
/**
 * @defgroup EP_Global_Macros Event Port Global Macros
 * @{
 */

/**
 * @defgroup EP_Port_source EP Port Source
 * @{
 */
#define EVT_PORT_1 (0U) /*!< Event port 1 */
#define EVT_PORT_2 (1U) /*!< Event port 2 */
#define EVT_PORT_3 (2U) /*!< Event port 3 */
#define EVT_PORT_4 (3U) /*!< Event port 4 */
/**
 * @}
 */

/**
 * @defgroup EP_pins_define EP Pin Source
 * @{
 */
#define EVT_PIN_00 (0x0001U)   /*!< Event port Pin 00 */
#define EVT_PIN_01 (0x0002U)   /*!< Event port Pin 01 */
#define EVT_PIN_02 (0x0004U)   /*!< Event port Pin 02 */
#define EVT_PIN_03 (0x0008U)   /*!< Event port Pin 03 */
#define EVT_PIN_04 (0x0010U)   /*!< Event port Pin 04 */
#define EVT_PIN_05 (0x0020U)   /*!< Event port Pin 05 */
#define EVT_PIN_06 (0x0040U)   /*!< Event port Pin 06 */
#define EVT_PIN_07 (0x0080U)   /*!< Event port Pin 07 */
#define EVT_PIN_08 (0x0100U)   /*!< Event port Pin 08 */
#define EVT_PIN_09 (0x0200U)   /*!< Event port Pin 09 */
#define EVT_PIN_10 (0x0400U)   /*!< Event port Pin 10 */
#define EVT_PIN_11 (0x0800U)   /*!< Event port Pin 11 */
#define EVT_PIN_12 (0x1000U)   /*!< Event port Pin 12 */
#define EVT_PIN_13 (0x2000U)   /*!< Event port Pin 13 */
#define EVT_PIN_14 (0x4000U)   /*!< Event port Pin 14 */
#define EVT_PIN_15 (0x8000U)   /*!< Event port Pin 15 */
#define EVT_PIN_All (0xFFFFU)  /*!< All event pins are selected */
#define EVT_PIN_MASK (0xFFFFU) /*!< Event pin mask for assert test */
/**
 * @}
 */

/**
 * @defgroup EP_PinDirection_Sel EP Pin Input/Output Direction Selection
 * @{
 */
#define EP_DIR_IN (0UL)  /*!< EP input */
#define EP_DIR_OUT (1UL) /*!< EP output */
/**
 * @}
 */

/**
 * @defgroup EP_FilterClock_Sel Event Port Filter Function Selection
 * @{
 */
#define EP_FILTER_OFF (0UL) /*!< EP filter function OFF */

#define EP_FILTER_ON (1UL) /*!< EP filter function ON */

/**
 * @}
 */

/**
 * @defgroup EP_FilterClock_Div Event Port Filter Sampling Clock Division Selection
 * @{
 */
#define EP_FCLK_DIV1 (0UL)                             /*!< PCLK as EP filter clock source */
#define EP_FCLK_DIV8 (1UL << AOS_PEVNTNFCR_DIVS1_POS)  /*!< PCLK div8 as EP filter clock source */
#define EP_FCLK_DIV32 (2UL << AOS_PEVNTNFCR_DIVS1_POS) /*!< PCLK div32 as EP filter clock source */
#define EP_FCLK_DIV64 (3UL << AOS_PEVNTNFCR_DIVS1_POS) /*!< PCLK div64 as EP filter clock source */

/**
 * @}
 */

/**
 * @defgroup EP_Trigger_Sel Event Port Trigger Edge Selection
 * @{
 */
#define EP_TRIG_NONE (0UL)    /*!< No Trigger by edge */
#define EP_TRIG_FALLING (1UL) /*!< Trigger by falling edge */
#define EP_TRIG_RISING (2UL)  /*!< Trigger by rising edge */
#define EP_TRIG_BOTH (3UL)    /*!< Trigger by falling and rising edge */

/**
 * @}
 */

/**
 * @defgroup EP_TriggerOps_Sel Event Port Operation
 * @{
 */
#define EP_OPS_NONE (0UL) /*!< Pin no action after triggered */  // 触针后无动作
#define EP_OPS_LOW (1UL) /*!< Pin ouput low after triggered */   // 触发后引脚输出过低
#define EP_OPS_HIGH (2UL) /*!< Pin ouput high after triggered */ // 触发后引脚输出高
#define EP_OPS_TOGGLE (3UL) /*!< Pin toggle after triggered */   // 触发后销切换
  /**
   * @}
   */

  /**
   * @}
   */

  /*******************************************************************************
   * Global variable definitions ('extern')
   ******************************************************************************/

  /*******************************************************************************
    Global function prototypes (definition in C source)
   ******************************************************************************/
  /**
   * @addtogroup EP_Global_Functions
   * @{
   */
  void EP_DeInit(void);
  int32_t EP_StructInit(stc_ep_init_t *pstcEventPortInit);

  int32_t EP_Init(uint8_t u8EventPort, uint16_t u16EventPin, const stc_ep_init_t *pstcEventPortInit);
  int32_t EP_SetTriggerEdge(uint8_t u8EventPort, uint16_t u16EventPin, uint32_t u32Edge);
  int32_t EP_SetTriggerOps(uint8_t u8EventPort, uint16_t u16EventPin, uint32_t u32Ops);
  en_ep_state_t EP_ReadInputPins(uint8_t u8EventPort, uint16_t u16EventPin);
  uint16_t EP_ReadInputPort(uint8_t u8EventPort);
  en_ep_state_t EP_ReadOutputPins(uint8_t u8EventPort, uint16_t u16EventPin);
  uint16_t EP_ReadOutputPort(uint8_t u8EventPort);
  void EP_SetPins(uint8_t u8EventPort, uint16_t u16EventPin);
  void EP_ResetPins(uint8_t u8EventPort, uint16_t u16EventPin);
  void EP_SetDir(uint8_t u8EventPort, uint16_t u16EventPin, uint32_t u32Dir);

  /**
   * @}
   */

#endif /* LL_EVENT_PORT_ENABLE */

  /**
   * @}
   */

  /**
   * @}
   */

#ifdef __cplusplus
}
#endif

#endif /* __HC32_LL_EVENT_PORT_H__ */

/*******************************************************************************
 * EOF (not truncated)
 ******************************************************************************/
